home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 076-100 / disk_077 / rawsamples / entab.d < prev    next >
Text File  |  1992-05-06  |  4KB  |  193 lines

  1. type FileHandle_t = ulong;
  2.  
  3. ulong
  4.     MODE_OLDFILE = 1005,
  5.     MODE_NEWFILE = 1006;
  6.  
  7. uint BUFFER_SIZE = 10000;
  8. uint NAME_SIZE = 100;
  9.  
  10. extern
  11.     OpenDosLibrary(ulong version)*byte,
  12.     CloseDosLibrary()void,
  13.     Rename(*char oldName, newName)ulong,
  14.     Open(*char fileName; ulong mode)FileHandle_t,
  15.     Close(FileHandle_t fd)void,
  16.     Read(FileHandle_t fd; *char buffer; ulong length)ulong,
  17.     Write(FileHandle_t fd; *char buffer; ulong length)ulong,
  18.     Exit(ulong status)void,
  19.     Output()FileHandle_t,
  20.     GetPars(*ulong pLen; **char pPtr)void;
  21.  
  22. [BUFFER_SIZE] char InputBuffer, OutputBuffer;
  23. uint InputPos, InputMax, OutputPos;
  24. bool Eof;
  25. FileHandle_t StdOut, InputFd, OutputFd;
  26.  
  27. proc print(*char message)void:
  28.    *char p;
  29.  
  30.     p := message;
  31.     while p* ~= '\e' do
  32.     p := p + 1;
  33.     od;
  34.     if Write(StdOut, message, p - message) ~= p - message then
  35.     Exit(40);
  36.     fi;
  37. corp;
  38.  
  39. proc getChar()char:
  40.  
  41.     if InputPos = InputMax then
  42.     InputPos := 0;
  43.     InputMax := Read(InputFd, &InputBuffer[0], BUFFER_SIZE);
  44.     if InputMax = 0 then
  45.         Eof := true;
  46.     fi;
  47.     fi;
  48.     InputPos := InputPos + 1;
  49.     InputBuffer[InputPos - 1]
  50. corp;
  51.  
  52. proc flushOutput()void:
  53.  
  54.    if Write(OutputFd, &OutputBuffer[0], OutputPos) ~= OutputPos then
  55.       print("entab: bad write to output file - aborting.\n");
  56.       Close(OutputFd);
  57.       Close(InputFd);
  58.       Exit(30);
  59.    fi;
  60. corp;
  61.  
  62. proc putChar(char ch)void:
  63.  
  64.     if OutputPos = BUFFER_SIZE then
  65.     flushOutput();
  66.     OutputPos := 0;
  67.     fi;
  68.     OutputBuffer[OutputPos] := ch;
  69.     OutputPos := OutputPos + 1;
  70. corp;
  71.  
  72. proc entab()void:
  73.     char ch;
  74.     uint column, doneColumn;
  75.     char CPM_EOF = '\(0x1a)';
  76.  
  77.     Eof := false;
  78.     column := 0;
  79.     doneColumn := 0;
  80.     while
  81.     ch := getChar();
  82.     not Eof and ch ~= CPM_EOF
  83.     do
  84.     if ch = '\t' then
  85.         column := (column + 8) & (0xfff8);
  86.     elif ch = ' ' then
  87.         column := column + 1;
  88.     else
  89.         if ch = '\n' then
  90.         putChar('\n');
  91.         column := 0;
  92.         doneColumn := 0;
  93.         elif ch ~= '\r' then
  94.         while (doneColumn + 8) & (0xfff8) <= column do
  95.             putChar('\t');
  96.             doneColumn := (doneColumn + 8) & (0xfff8);
  97.         od;
  98.         while doneColumn ~= column do
  99.             putChar(' ');
  100.             doneColumn := doneColumn + 1;
  101.         od;
  102.         putChar(ch);
  103.         column := column + 1;
  104.         doneColumn := doneColumn + 1;
  105.         fi;
  106.     fi;
  107.     od;
  108. corp;
  109.  
  110. proc process(*char fileName)void:
  111.     *char p, q;
  112.     [NAME_SIZE] char nameBuffer;
  113.  
  114.     p := &nameBuffer[0];
  115.     q := fileName;
  116.     while
  117.     p* := q*;
  118.     p* ~= '\e'
  119.     do
  120.     p := p + 1;
  121.     q := q + 1;
  122.     od;
  123.     (p + 0)* := '.';
  124.     (p + 1)* := 'B';
  125.     (p + 2)* := 'A';
  126.     (p + 3)* := 'K';
  127.     (p + 4)* := '\e';
  128.     if Rename(fileName, &nameBuffer[0]) = 0 then
  129.     print("Can't rename file to .BAK - aborting\n");
  130.     Exit(30);
  131.     fi;
  132.     InputFd := Open(&nameBuffer[0], MODE_OLDFILE);
  133.     if InputFd = 0 then
  134.     print("Can't open old file for input - aborting\n");
  135.     Exit(20);
  136.     fi;
  137.     OutputFd := Open(fileName, MODE_NEWFILE);
  138.     if OutputFd = 0 then
  139.     print("Can't open new file for output - aborting\n");
  140.     Close(InputFd);
  141.     Exit(30);
  142.     fi;
  143.     InputPos := 0;
  144.     InputMax := 0;
  145.     OutputPos := 0;
  146.     entab();
  147.     if OutputPos ~= 0 then
  148.     flushOutput();
  149.     fi;
  150.     Close(InputFd);
  151.     Close(OutputFd);
  152. corp;
  153.  
  154. proc main()void:
  155.     *char parPtr;
  156.     ulong parLen;
  157.     *char nameStart;
  158.     bool doneFile;
  159.  
  160.     if OpenDosLibrary(0) ~= nil then
  161.     GetPars(&parLen, &parPtr);
  162.     StdOut := Output();
  163.     doneFile := false;
  164.     while
  165.         while parLen ~= 0 and
  166.             (parPtr* = ' ' or parPtr* = '\n' or parPtr* = '\r') do
  167.         parLen := parLen - 1;
  168.         parPtr := parPtr + 1;
  169.         od;
  170.         parLen ~= 0
  171.     do
  172.         doneFile := true;
  173.         nameStart := parPtr;
  174.         while parLen ~= 0 and
  175.             parPtr* ~= ' ' and parPtr* ~= '\n' and parPtr* ~= '\r' do
  176.         parLen := parLen - 1;
  177.         parPtr := parPtr + 1;
  178.         od;
  179.         parPtr* := '\e';
  180.         parLen := parLen - 1;
  181.         parPtr := parPtr + 1;
  182.         print(nameStart);
  183.         print(":\n");
  184.         process(nameStart);
  185.     od;
  186.     if not doneFile then
  187.         print("Use is: entab file ... file\n");
  188.         Exit(10);
  189.     fi;
  190.     CloseDosLibrary();
  191.     fi;
  192. corp;
  193.